// Constants (常量) 示例
// 演示 Pascal 中常量的声明和使用
program p_4_constants;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 常量声明部分
// 常量在程序执行过程中不能被修改，提高代码可读性和安全性
const
  // 数学常量
  PI = 3.14159265359;          // 圆周率
  E = 2.71828182846;           // 自然常数
  
  // 物理常量
  SPEED_OF_LIGHT = 299792458;  // 光速 (米/秒)
  GRAVITY = 9.8;               // 重力加速度 (米/秒²)
  
  // 程序配置常量
  MAX_USERS = 100;             // 最大用户数
  APP_VERSION = '1.0.0';       // 应用版本
  APP_NAME = 'Constants Demo'; // 应用名称
  
  // 字符常量
  TAB = #9;                    // 制表符
  NEW_LINE = #13#10;           // 换行符 (Windows)
  
  // 布尔常量
  DEBUG_MODE = True;           // 调试模式
  IS_PRODUCTION = False;       // 是否生产环境

// 变量声明部分
var
  radius: Real;
  area: Real;
  circumference: Real;
  userName: String;
  userCount: Integer;

// 程序主入口
begin
  // 使用常量进行计算
  radius := 5.0;
  area := PI * radius * radius;
  circumference := 2 * PI * radius;
  
  // 使用字符串常量
  userName := 'Pascal Developer';
  userCount := 25;
  
  // 输出程序信息（使用常量）
  WriteLn('=== ', APP_NAME, ' v', APP_VERSION, ' ===');
  WriteLn;
  
  // 输出数学计算结果
  WriteLn('数学常量演示:');
  WriteLn('π (PI) = ', PI:0:11);
  WriteLn('e (E) = ', E:0:11);
  WriteLn;
  
  // 输出计算结果（使用常量）
  WriteLn('圆计算 (半径 = ', radius:0:1, '):');
  WriteLn('面积 = π × r² = ', area:0:2);
  WriteLn('周长 = 2 × π × r = ', circumference:0:2);
  WriteLn;
  
  // 输出物理常量
  WriteLn('物理常量:');
  WriteLn('光速 = ', SPEED_OF_LIGHT, ' m/s');
  WriteLn('重力加速度 = ', GRAVITY:0:1, ' m/s²');
  WriteLn;
  
  // 输出配置信息
  WriteLn('程序配置:');
  WriteLn('最大用户数: ', MAX_USERS);
  WriteLn('当前用户数: ', userCount);
  WriteLn('调试模式: ', DEBUG_MODE);
  WriteLn('生产环境: ', IS_PRODUCTION);
  WriteLn;
  
  // 演示常量表达式
  WriteLn('常量表达式:');
  WriteLn('一半最大用户数: ', MAX_USERS div 2);
  WriteLn('双倍重力: ', 2 * GRAVITY:0:1, ' m/s²');
  
  WriteLn;
  WriteLn('演示了 Pascal 中常量的声明和使用');
  WriteLn('注意：常量在程序运行过程中不能被修改');
  
  // 尝试修改常量会导致编译错误
  // MAX_USERS := 200;  // 这行代码会导致编译错误
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.